package demo2;

import java.util.Arrays;

public class MyArrayList {

    public int[] elem;
    public int usedsize;  //当前数组存储的有效数据的个数
    public static final int DEFAULT_SIZE = 10;  //默认初始化空间大小

    //初始化
    public MyArrayList() {
        this.elem = new int[DEFAULT_SIZE];
    }

    //打印--->顺序表并不包含此方法，是为了方便测试才1在这里加进来的
    public void display() {
        for (int i = 0; i < this.usedsize; i++) {
            System.out.print(this.elem[i] + " ");
        }
        System.out.println();
    }

    //获取长度
    public int size() {
        return this.usedsize;
    }

    //判断是否包含指定元素
    public boolean contains(int toFIind) {
        for (int i = 0; i < this.usedsize; i++) {
            if(this.elem[i] == toFIind) {
                //-->此处是int才能用 == ，如果是引用类型要用equals
                return true;
            }
        }
        return false;
    }

    public int indexOf(int toFind) {
        for (int i = 0; i < this.usedsize; i++) {
            if (this.elem[i] == toFind) {
                return i;
            }
        }
        return -1;//因为数组没有负数下标，所以返回-1
    }

    //判断是否满了
    public boolean isFull() {
        if(this.usedsize >= this.elem.length) {
            //此处不和DEFAULT_SIZE比较是因为，如果已经扩过容了那么数组的长度就不会是DEFAULT_SIZE了，这个时候比较就一定为真，所以应该和数组的长度比较
            return true;
        }
        return false;
    }

    //扩容方法，扩容只是为了提供给add的，所以设置为private
    private int[] resize() {
        return Arrays.copyOf(this.elem,
                this.elem.length*2);
    }

    //增加元素,默认放在数组最后的位置
    public void add(int data) {
        //判断数组是否已经满了,满了需要扩容
        if(isFull()) {
            //扩容
            this.elem = resize();
        }
        this.elem[this.usedsize] = data;
        this.usedsize++;

    }

    //在指定位置增加元素
    public void add(int pos,int data)throws IndexOutOfException {

        //判断位置是否合理
        setCheckIndex(pos);
        //扩容
        if (isFull()) {
            this.elem = resize();
        }
        for (int i = this.usedsize-1; i >= pos ; i--) {
            this.elem[i + 1] = this.elem[i];
        }
        this.elem[pos] = data;
        this.usedsize++;
    }

    //检查插入位置是否合法

    /**
     * 检查add数据的时候，pos是否合法
     * @param pos
     * @return
     */
    private void setCheckIndex(int pos) throws IndexOutOfException{
        if(pos < 0 || pos > this.usedsize) {
            throw new IndexOutOfException("下标非法");
        }
    }

    private void getCheckIndex(int pos) {
        if(pos < 0 || pos >= this.usedsize) {
            throw new IndexOutOfException("下标非法");
        }
    }

    //获取数组pos位置的元素
    public int get(int pos) {
        getCheckIndex(pos);
        return this.elem[pos];
    }
    //在pos位置设置元素
    public void set(int pos,int val) {
        //判断更新位置是否合法
        getCheckIndex(pos);
        this.elem[pos] = val;
        if(pos == this.usedsize) {
            this.usedsize++;
        }
    }

    /**
     * 判断数组是否为空
     * @return
     */
    public boolean isEmpty() {
        if(this.usedsize == 0) {
            return true;
        }
        return false;
    }

    //删除元素指定位置的元素
    public void deletePos(int pos) {

        getCheckIndex(pos);
        for (int i = pos; i < this.usedsize-1; i++) {
            this.elem[i] = this.elem[i+1];
        }
        this.usedsize--;
    }

    //删除指定元素
    public void deleteKey(int toRemove) {
        int i = indexOf(toRemove);
        if(i == -1) {
            return;
        }
        deletePos(i);
    }


}


